package root.server;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;



public class MenuLogado {

	private static Sessao sessao;	
	private static Sistema sistema = new Sistema();

	
	public MenuLogado(String login) throws Exception{
		this.sessao = sistema.getSessao(sistema.abrirSessao(login));
	}
	
	protected void main() {
		System.out.println("**Sucess: User logged in successfully");
		boolean logado = true;
		while(logado){
			String opcao = MenuLogado();//MENU DE LOGADO
			if(opcao.equals("1")){ //See Profile OK
				seeProfile();
			}else if(opcao.equals("2")){ //Search User OK
				searchUser();
			}else if(opcao.equals("3")){ //Messages OK
				menuMessages();
			}else if(opcao.equals("4")){ //See My Friends OK
				seeFriends();
			}else if(opcao.equals("5")){ //MANAGE ITEMS OK
				MenuGerenciarItens();
			}else if(opcao.equals("6")){ //Notifications
				menuNotifications();
			}else if(opcao.equals("7")){ //See Ranking OK
				seeRanking();
			}else if(opcao.equals("8")){
				verHistorico();
			}else {
				logado = false;
			}
		} 
	}

	private static Scanner getScanner() {
		return new Scanner(System.in);
	}

	private static String MenuLogado(){
		System.out.println(
				"\n *******************************\n"
				+ "  [1] - See Profile\n" 
				+ "  [2] - Search User\n"//procura por nome e endereco, Add amigo
				+ "  [3] - Messages\n"//posso enviar e ler as minhas 
				+ "  [4] - See My Friends\n"//visualizar lista de amigos
				+ "  [5] - MANAGE ITEMS\n"	
				+ "  [6] - Notifications\n"
				+ "  [7] - See Ranking\n"
				+ "  [8] - Histórico de atividade"
				+ "  [0] - Logout\n"
				+ " *******************************");
		return getScanner().next();
	}

	private static void MenuGerenciarItens(){
		boolean itensON = true;
		while(itensON){
			System.out.print(
					"\n *******************************\n"
					+ "  [1] - Add Item\n"
					+ "  [2] - See My Items\n" //visualizar meus items
					+ "  [3] - Ver Emprestimos\n" //items meus emprestados, visualizar os que peguei emprestado
					+ "  [Other] - Back\n"
					+ " *******************************\n"
					+ ">> ");
			String opcaoItens = getScanner().next();
			if(opcaoItens.equals("1")){ //Add Item ok
				addItem();
			}else if(opcaoItens.equals("2")){ //See Items ok
				seeMyItems();
			}else if(opcaoItens.equals("3")){ //Ver emprestimos ok
				menuVerEmprestimos();
			}else{
				itensON = false;
			}
		}
	}
	
	
	
	private static void seeFriends(){
		boolean seeON = true;
		while(seeON){
			try {
				System.out.println(sistema.getAmigos(sessao.getIdSessao()));
			} catch (Exception e) {
				e.getMessage();
			}
			System.out.print(
					"\n *******************************\n"
					+ "  [1] - See Profile\n"
					+ "  [2] - Desfazer amizade\n"
					+ "  [Other] - Back\n"
					+ " *******************************\n"
					+ ">> ");
			String opcao = getScanner().next();
			if(opcao.equals("1")){
				System.out.print("\nFriend's Login: ");
				String login = getScanner().nextLine();
				seeProfile(login);
				menuSeeProfile(login);
			}else if(opcao.equals("2")){
				System.out.print("\nFriend's Login: ");
				String login = getScanner().nextLine();
				try {
					sistema.desfazerAmizade(sessao.getIdSessao(),login);
				} catch (Exception e) {
					e.getMessage();
				}
			}else{
				seeON = false;
			}
		}
	}
	
	private static void searchUser(){
		System.out.print("Chave: ");
		String chave = getScanner().nextLine();
		System.out.print("Atributo: ");
		String atributo = getScanner().nextLine();
		String resultSearch;
		try{
			resultSearch = sistema.localizarUsuario(sessao.getIdSessao(), chave, atributo);
			if(resultSearch.equals("Nenhum usuário encontrado")){
				System.out.println("\n *******************************"
						          +"\n    " + resultSearch + "   "
						          +"\n *******************************");
			}else{
				String[] result = resultSearch.split("; ");
				System.out.println("**Search Result: ");
				for(String user:result){
					System.out.println("  >> "+user);
				}
				menuSearchUser();
			}
			
			
		}catch(Exception e){
			System.out.println("**Error: "+e.getMessage());
		}
	}
	
	private static void menuSearchUser() {
		boolean searchON = true;
		while(searchON){
			System.out.print(
					"\n *******************************\n"
					+ "  [1] - See Profile\n"
					+ "  [2] - Add Friend \n"
					+ "  [Other] - Back\n"
					+ " *******************************\n"
					+ ">> ");
			String opcaoSearch = getScanner().next();
			if(opcaoSearch.equals("1")){ //See Profile
				System.out.print("\nLogin do usuario: ");
				String login = getScanner().nextLine();
				seeProfile(login);
				menuSeeProfile(login);
			}else if(opcaoSearch.equals("2")){ //Add Friend
				System.out.print("\nLogin do usuario: ");
				String login = getScanner().nextLine();
				addFriend(login);
			}else{ //Back
				searchON = false;
			}
		}
	}
	
	private static void seeProfile(){
		try {
			Usuario user = sessao.getUsuario();
			System.out.println("Name: " + user.getNome() + "\nAdress: " + user.getEndereco());
			System.out.println("\nFriends: " + sistema.getAmigos(sessao.getIdSessao()));
			System.out.println("\nItems: " + sistema.getItens(sessao.getIdSessao()));
		} catch (Exception e) {
			e.getMessage();
		}
		
	}
	
	private static void seeProfile(String login){
		try {
			Usuario user = sistema.getUsuarioPorLogin(login);
			System.out.println("Name: " + user.getNome() + "\nAdress: " + user.getEndereco());
			System.out.println("\nFriends: " + sistema.getAmigos(sessao.getIdSessao(),login));
			if(sistema.ehAmigo(sessao.getIdSessao(), login)){
				System.out.println("\nItems: " + sistema.getItens(sessao.getIdSessao()));
			}
		} catch (Exception e) {
			e.getMessage();
		}
		
	}

	private static void menuSeeProfile(String login) {
		boolean seeON = true;
		while(seeON){
			System.out.println();
			boolean ehAmigo = false;
			try {
				ehAmigo = sistema.ehAmigo(sessao.getIdSessao(), login);
			} catch (Exception e) {
				e.getMessage();
			}
			if(ehAmigo){
				System.out.print(
						"\n *******************************"
						+ "\n  [1] - Desfazer amizade"
						+ "\n  [2] - See Friends"
						+ "\n  [3] - See Items (Emprestimo)"
						+ "\n  [Other] - Back"
						+ "\n *******************************"
						+ "\n>> ");
			}else{
				System.out.print(
						"\n *******************************"
						+ "\n  [1] - Solicitar amizade"
						+ "\n  [2] - See Friends"
						+ "\n  [Other] - Back"
						+ "\n *******************************"
						+ "\n>> ");
			}
			String opcao = getScanner().next();
			if(opcao.equals("1") && !ehAmigo){
				addFriend(login);
			}else if(opcao.equals("1") && ehAmigo){
				try {
					sistema.desfazerAmizade(sessao.getIdSessao(),login);
				} catch (Exception e) {
					e.getMessage();
				}
			}else if(opcao.equals("2")){
				menuSearchUser();
			}else if(opcao.equals("3") && ehAmigo){
				menuSeeItems(login);
			}else if(opcao.equals("3") && !ehAmigo){
				System.out.println("**Error: Opcao invalida");
			}else{
				seeON = false;
			}

			
		}
				
	}
	
	private static void addFriend(String login) {		
		try {
			sistema.requisitarAmizade(sessao.getIdSessao(), login);
		} catch (Exception e) {
			e.getMessage();
		}
		System.out.println("\nRequisição de amizade enviada. Espere a confirmação.");
	}

	private static void menuSeeItems(String login) {
		List<Item> listaItens = new ArrayList<Item>();
		boolean itensON = true;
		String indice;
		while(itensON){
			Usuario user;
			try {
				user = sistema.getUsuarioPorLogin(login);
				listaItens = user.getRepositorioItem();
			} catch (Exception e) {
				e.getMessage();
			}
			
			for(int i=0;i<listaItens.size();i++){
				System.out.println((i+1)+". "+listaItens.get(i).toString());
			}
			
			System.out.print("Escolha o item pelo índice. Tecle 'voltar' para voltar."
					      +"\nItem (pelo indice): ");
			indice = getScanner().next();
			if(indice.equals("voltar")){
				itensON = false;
				break;
			}
			System.out.print("Duração: ");
			int duracao = getScanner().nextInt();
			int indiceInt = Integer.valueOf(indice);
			
			if(indiceInt > 0 && indiceInt < listaItens.size()){
				indiceInt = indiceInt - 1;
				Item item = listaItens.get(indiceInt);
				try{
					sistema.requisitarEmprestimo(sessao.getIdSessao(), item.getIDItem(), duracao);
				}catch(Exception e){
					e.getMessage();
				}
			}else{
				System.out.println("Indice inválido.");
			}

		}
		
	}

	private static void addItem(){
		System.out.print("Name: ");
		String name = getScanner().nextLine();
		System.out.print("Description: ");
		String description = getScanner().nextLine();
		System.out.print("Category(Jogo/Filme/Livro): ");
		String category = getScanner().next().toLowerCase();
		category = category.substring(0,1).toUpperCase() + category.substring(1);
		System.out.println("Category: "+ category);
		try{
			sistema.cadastrarItem(sessao.getIdSessao(), name, description, category);
			System.out.println("Item successfully added");
		}catch(Exception e){
			System.out.println("**Error: "+e.getMessage());
		}		
	}
	
	private static void removeItem(Item item){
		String idItem = item.getIDItem();
		try {
			sistema.apagarItem(sessao.getIdSessao(), idItem);
		} catch (Exception e) {
			e.getMessage();
		}
	}
	
	private static void seeMyItems(){
		List<Item> listaItens = new ArrayList<Item>();
		Usuario user;
		String qualItem;
		boolean seeON = true;
		while(seeON){
			try {
				user = sessao.getUsuario();
				listaItens = user.getRepositorioItem();
			} catch (Exception e) {
				e.getMessage();
			}
			for(int i=0;i<listaItens.size();i++){
				System.out.println((i+1)+". "+listaItens.get(i).toString());
			}
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Remove Item"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			String opcao = getScanner().nextLine();
			if(opcao.equals("1")){
				System.out.print("Escolha o item a ser removido pelo indice. \n >>");
				qualItem = getScanner().next();
				int indice = Integer.valueOf(qualItem);
				if(indice > 0 && indice < listaItens.size()){
					indice = indice - 1;
					Item item = listaItens.get(indice);
					removeItem(item);
				}else{
					System.out.println("**Error: Indice invalido");
				}
			}else{
				seeON = false;
			}
		}
	}
	
	private static void menuVerEmprestimos(){
		boolean emprestimosON = true;
		String opcao;
		String tipo;
		while(emprestimosON){
			System.out.print(
					  "\n *******************************"
					+ "\n  [1] - Emprestador"
					+ "\n  [2] - Beneficiado"
					+ "\n  [3] - Todos"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				tipo = "emprestador";
				verEmprestimos(tipo);
			}else if(opcao.equals("2")){
				tipo = "beneficiado";
			}else if(opcao.equals("3")){
				tipo = "todos";
			}else{
				emprestimosON = false;
			}
		}
	}

	private static void verEmprestimos(String tipo) {
		List<Emprestimo> listaEmprestimos = null;
		String[] emprestimos = null;
		boolean emprestimosON = true;
		while(emprestimosON){
			
			try {
				listaEmprestimos = sessao.getUsuario().getRepositorioEmprestimo(tipo);
				emprestimos = sistema.getEmprestimos(sessao.getIdSessao(), tipo).split("; ");
			} catch (Exception e) {
				e.getMessage();
			}
			
			for(int i=0;i<emprestimos.length;i++){
				System.out.println((i+1)+". "+emprestimos[i]);
			}
			
			if(tipo.equals("emprestador")){
				System.out.print(
						"\n *******************************"
						+ "\n  [1] - Requisitar devolução"
						+ "\n  [Other] - Back"
						+ "\n *******************************"
						+ "\n>> ");
			}else if(tipo.equals("beneficiado")){
				System.out.print(
						"\n *******************************"
						+ "\n  [2] - Terminar emprestimo e devolver item"
						+ "\n  [Other] - Back"
						+ "\n *******************************"
						+ "\n>> ");
			}else{
				System.out.print(
						"\n *******************************"
						+ "\n  [1] - Requisitar devolução"
						+ "\n  [2] - Terminar emprestimo e devolver item"
						+ "\n  [Other] - Back"
						+ "\n *******************************"
						+ "\n>> ");
			}
			String opcao = getScanner().next();
			if((opcao.equals("2") && tipo.equals("emprestador")) || (opcao.equals("2") && tipo.equals("todos"))){
				requisitarDevolucao(listaEmprestimos);
			}else if((opcao.equals("2") && tipo.equals("beneficiado")) || (opcao.equals("2") && tipo.equals("todos"))){
				devolverItem(listaEmprestimos);
			}else{
				emprestimosON = false;
			}
		}
		
	}

	private static void devolverItem(List<Emprestimo> listaEmprestimos) {
		System.out.print("Terminar o emprestimo: ");
		int indice = getScanner().nextInt() - 1;
		String idEmprestimo = listaEmprestimos.get(indice).getIdEmprestimo();
		try {
			sistema.devolverItem(sessao.getIdSessao(), idEmprestimo);
			System.out.println("Emprestimo finalizado e item devolvido. Aguarde confirmação do emprestador.");
		} catch (Exception e) {
			e.getMessage();
		}
	}

	private static void requisitarDevolucao(List<Emprestimo> listaEmprestimos) { 
		System.out.print("Requisitar devolução do item: ");
		int indice = getScanner().nextInt() - 1;
		String idEmprestimo = listaEmprestimos.get(indice).getIdEmprestimo();
		try {
			sistema.requisitarDevolucao(sessao.getIdSessao(), idEmprestimo);
			System.out.println("Requisição de devolução enviada com sucesso.");
		} catch (Exception e) {
			e.getMessage();
		}
	}
	
	private static void seeRanking(){
		boolean rankingON = true;
		String opcao;
		String ranking = "";
		String[] listaRanking;
		while(rankingON ){
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Global Ranking"
					+ "\n  [2] - Friends Ranking"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				try {
					ranking = sistema.getRanking(sessao.getIdSessao(), "global");
				} catch (Exception e) {
					e.getMessage();
				}
			}else if(opcao.equals("2")){
				try {
					ranking = sistema.getRanking(sessao.getIdSessao(), "amigos");
				} catch (Exception e) {
					e.getMessage();
				}
			}else{
				rankingON = false;
				break;
			}
			listaRanking = ranking.split("; ");
			for(int i=0;i<listaRanking.length;i++){
				System.out.println((i+1)+". "+listaRanking[i]);
			}
		}
	}
	
	private static void menuMessages(){
		boolean messagesON = true;
		String opcao;
		while(messagesON ){
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Send Message"
					+ "\n  [2] - Read Topicos"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				sendMessage();
			}else if(opcao.equals("2")){
				menuReadTopicos();
			}else{
				messagesON = false;
				break;
			}
		}
	}

	private static void sendMessage() {
		System.out.print("Login do destinatario: ");
		String destinatario = getScanner().nextLine();
		System.out.print("Assunto: ");
		String assunto = getScanner().nextLine();
		System.out.print("Mensagem: ");
		String mensagem = getScanner().nextLine();
		try {
			sistema.enviarMensagem(sessao.getIdSessao(), destinatario, assunto, mensagem);
		} catch (Exception e) {
			e.getMessage();
		}
	}
	
	private static void menuReadTopicos() {
		String tipo = "todos";
		System.out.print(
				"\nEscolha o tipo de mensagem"
				+ "\n *******************************"
				+ "\n  [1] - Negociação"
				+ "\n  [2] - Offtopic"
				+ "\n  [3] - Todos"
				+ "\n  [Other] - Back"
				+ "\n *******************************"
				+ "\n>> ");
		String opcao = getScanner().next();
		if(opcao.equals("1")){
			tipo = "negociacao";
			readTopicos(tipo);
		}else if(opcao.equals("2")){
			tipo = "offtopic";
			readTopicos(tipo);
		}else if(opcao.equals("3")){
			tipo = "todos";
			readTopicos(tipo);
		}else{
			
		}
	}

	private static void readTopicos(String tipo) {
		boolean topicosON = true;
		String opcao;
		Usuario user = null;
		String[] topicos = null;
		List<Topico> listaTopicos = null;
		while(topicosON){
			try {
				user = sessao.getUsuario();
				listaTopicos = user.getRepositorioMensagem(tipo);
				topicos = sistema.lerTopicos(sessao.getIdSessao(), tipo).split("; ");
			} catch (Exception e) {
				e.getMessage();
			}
			for(int i=0;i<topicos.length;i++){
				System.out.println((i+1)+". "+topicos[i]);
			}

			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Read Messages"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				readMessages(listaTopicos);
			}else{
				topicosON = false;
				break;
			}
		}
	}

	private static void readMessages(List<Topico> listaTopicos) {
		System.out.print("Topico (índice): ");
		int indice = getScanner().nextInt() - 1;
		Topico topico = listaTopicos.get(indice);
		String[] messages;
		try {
			messages = sistema.lerMensagens(sessao.getIdSessao(), topico.getIdTopic()).split("; ");
			for(String s:messages){
				System.out.println("> " + s);
			}
			System.out.println("\nTecle enter para voltar...\n");
			String opcao = getScanner().next();
		} catch (Exception e) {
			e.getMessage();
		}
	}
	
	private static void menuNotifications(){
		boolean on = true;
		String opcao;
		while(on){
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Notificações de amizade"
					+ "\n  [2] - Notificações de emprestimo"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				menuAprovarAmizade();
			}else if(opcao.equals("2")){ 
				menuNotificacoesEmprestimo();
			}else{
				on = false;
			}
		}
	}


	private static void menuAprovarAmizade() {
		Usuario user = null;
		List<Usuario> listaUsers = null ;
		String opcao;
		boolean on = true;
		while(on){
			try {
				user = sessao.getUsuario();
				listaUsers = user.getRepositorioRequisicoesAmizade();
			} catch (Exception e) {
				e.getMessage();
			}
			
			int i = 1;
			for(Usuario u:listaUsers){
				System.out.println(i+". "+u.getLogin());
				i++;
			}
			
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Aprovar amizade"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				aprovarAmizade(listaUsers);
			}else{
				on = false;
			}
		}
	}

	private static void aprovarAmizade(List<Usuario> listaUsers) {
		System.out.println("Aprovar usuario: ");
		String login = getScanner().nextLine();
		try {
			sistema.aprovarAmizade(sessao.getIdSessao(), login);
		} catch (Exception e) {
			e.getMessage();
		}
	}
	
	private static void menuNotificacoesEmprestimo() {
		boolean on = true;
		String opcao;
		while(on){
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Confirmar Devoluções"
					+ "\n  [2] - Aprovar Empréstimo"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				menuConfirmarDevolucao();
			}else if(opcao.equals("2")){ 
				
			}else{
				on = false;
			}
		}
	}

	private static void menuConfirmarDevolucao() {
		boolean on = true;
		String opcao;
		Usuario user = null;
		List<Emprestimo> listaEmprestimos = null;
		String[] emprestimos = null;
		while(on){
			try {
				user = sessao.getUsuario();
				listaEmprestimos = user.getListBeneficiado();
				emprestimos = sistema.getEmprestimos(sessao.getIdSessao(), "beneficiado").split("; ");
			} catch (Exception e) {
				e.getMessage();
			}
			int i = 0;
			for(String e:emprestimos){
				System.out.println((i+1)+". "+e);
				i++;
			}
			System.out.print(
					"\n *******************************"
					+ "\n  [1] - Confirmar Devolução"
					+ "\n  [Other] - Back"
					+ "\n *******************************"
					+ "\n>> ");
			opcao = getScanner().next();
			if(opcao.equals("1")){
				confirmarDevolucao(listaEmprestimos);
			}else if(opcao.equals("2")){ 

			}else{
				on = false;
			}
		}
	}

	private static void confirmarDevolucao(List<Emprestimo> listaEmprestimos) {
		try {
			System.out.println("Emprestimo pelo indice: ");
			int indice = getScanner().nextInt() - 1;
			String idEmprestimo = listaEmprestimos.get(indice).getIdEmprestimo();
			sistema.confirmarTerminoEmprestimo(sessao.getIdSessao(), idEmprestimo);
			System.out.println("Devolução confirmada.");
		} catch (Exception e) {
			e.getMessage();
		}
	}
	
	private static void verHistorico(){
		
	}
	
}